﻿using System.IO;
using System.Net;
using System.Collections;
using System.Text;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace VkontakteAgent
{
    public class UserAPI
    {
        public string sid = string.Empty;

        public UserAPI(string Email, string Pass)
        {
            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(VkontakteAgent.resources.Resource.urlAutorization + 
                    "&email=" + Email + "&pass=" + Pass);
                request.Method = "GET";
                /* Отключаем автоматическую переадресацию,
                  * т.к sid передаётся в заголовке Location */
                request.AllowAutoRedirect = false;
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();

                sid = response.Headers.Get("Location");
                /* Пример значения заголовка Location:
                  * durov.ru/index.html;sid=c9858c2feaa17203fa87e6b8c2371380
                  * Читаем последние 32 символа с конца 
                  * и получаем заветный sid :)*/
                // Проверим правильность авторизации
                if (sid.Substring(sid.Length - 2) == "-4")
                {
                    sid = "-4";
                }
                else
                {
                    sid = sid.Substring(sid.Length - 32);
                }
            }
            catch(System.Exception ex)
            {
                System.Windows.Forms.MessageBox.Show("Невозможно провести авторизацию пользователя. " +
                    "Возможно отсутствует подключение к интернету. " + ex.Message, "Ошибка!", System.Windows.Forms.MessageBoxButtons.OK, 
                    System.Windows.Forms.MessageBoxIcon.Error, System.Windows.Forms.MessageBoxDefaultButton.Button1);
            }
        }

        private string Request(string r)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(VkontakteAgent.resources.Resource.urlApi + r);
            request.Method = "GET";
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream responseStream = response.GetResponseStream();
            StringBuilder sb = new StringBuilder();
            
            int count = 0;
            byte[] buf = new byte[1024];
            do
            {
                count = responseStream.Read(buf, 0, buf.Length);
                /* Ответ от сервера приходит в кодировке UTF-8 */
                sb.Append(Encoding.UTF8.GetString(buf, 0, count));
            }
            while (count > 0);
            return sb.ToString();
        }
        public string UserMessage(int Id, int From, int To)
        {
            //http://userapi.com/data?​act=inbox&from=0&to=2&​id=10&sid=622ccd76a5b4b67​fbc753abd53e41ad2 
            //ArrayList tmp = new ArrayList();
            string req = Request("act=inbox&from=" + From + "&to=" + To + "&id=" + Id + "&sid=" + sid);
            return req;
        }
        public string UserID()
        {
            string req = Request("act=profile&sid=" + sid);
            ArrayList al = JsonConvert.DeserializeObject<ArrayList>(req);
            
            return "";
        }

        public Friend[] UserFriends(int From, int To)
        {
            //ArrayList tmp = new ArrayList();
            string req = Request("act=friends&from=" + From + "&to=" + To + "&sid=" + sid);
            ArrayList al = JsonConvert.DeserializeObject<ArrayList>(req);
            Friend[] f = new Friend[al.Count];
            JArray ja;
            for (int i = 0; i < al.Count; i++)
            {
                ja = (JArray)al[i];
                f[i] = new Friend();
                /* id пользователя */
                f[i].Id = (int)ja[0];
                /* Имя и фамилия */
                f[i].Name = (string)ja[1];
                /* URL фотографии */
                f[i].PicUrl = (string)ja[2];
                /* Если 1, то пользователь Online */
                f[i].Online = (int)ja[3] == 1;
            }
            return f;
        }

        public Status ReadStatus(int Id)
        {
            string req = Request("act=activity&from=0&to=1&id=" + Id + "&sid=" + sid);
            JsonData jd = JsonConvert.DeserializeObject<JsonData>(req);
            return jd.Processing();
        }
    }
}
